home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (DO)
/
Peeker Nr. 15 (1986)(Verlag, Dr. Alfred Huethig)(DE).zip
/
Peeker Nr. 15 (1986)(Verlag, Dr. Alfred Huethig)(DE).do
/
STRINGDEMOS.txt
< prev
next >
Wrap
Text File
|
1996-12-24
|
9KB
|
288 lines
PROGRAM STRINGBEFEHLE;
CONST STRLEN = 10; {Name 'STRLEN' erforderlich}
TYPE STRING = ARRAY [1..STRLEN] OF CHAR; {Name 'STRING' erforderlich}
VAR S, G, T, T1, T2: STRING; L, P, A: INTEGER; {Nur fuer Demo}
{========================================================================}
{String-Include-Datei, zusammengestellt von U.Stiehl im Dez. 1985}
{
String-Befehle
==============
L := LENGTH (S); Integer-Funktion: L wird geaendert
G := CONCAT (T1,T2); String-Funktion: G wird geaendert
P := POS (T,G); Integer-Funktion: P wird geaendert
T := COPY (G,P,A); String-Funktion: T wird geaendert
DELETE (G,P,A); String-Prozedur: G wird geaendert
INSERT (T,G,P); String-Prozedur: G wird geaendert
S = String, G = Gesamtstring, T = Teilstring, ferner T1 und T2
L = Laenge, P = Position, A = Anzahl der Zeichen
Im Hauptprogrammkopf muessen definiert werden:
als CONST STRLEN mit Integer-Wert >= 2,
als TYPE STRING mit 1..STRLEN.
}
{------------------------------------------------------------------------}
{
LENGTH ermittelt Netto-Laenge ohne Leertasten am String-Ende, d.h.
Leertasten links werden mitgezaehlt, Leertasten rechts abgezogen.
Aufrufen mit L := LENGTH (S). Beispiele:
123 Zaehlleiste
S := 'abc' L = 3: Keine Leertasten.
S := ' ' L = 0: Nur Leertasten = Nullstring.
S := 'a ' L = 1: Leertasten rechts entfernt.
S := ' a ' L = 2: Fuehrende Leertaste zaehlt mit.
S := 'a c' L = 3: Leertaste in der Mitte zaehlt mit.
}
FUNCTION LENGTH (S:STRING):INTEGER;
VAR L:INTEGER;
BEGIN
L := STRLEN; WHILE (S[L] = ' ') AND (L > 1) DO L := L - 1;
IF (L = 1) AND (S[1] = ' ') THEN LENGTH := 0 ELSE LENGTH := L
END;
{------------------------------------------------------------------------}
{
CONCAT vereinigt die 2 Teilstrings T1 und T2 zu einem Gesamtstring G.
Aufrufen mit G := CONCAT (T1,T2). Beispiel:
1234567890 Zaehlleiste
P
'abcde ' T1
'fghij ' T2
'abcde ' Zunaechst T1 in G ab P = 1
'abcdefghij' Dannn T2 in G ab P = 6
Wenn T1 und T2 nicht zusammen in G passen, wird zunaechst T1 in G kopiert
und dann soviel von T2, wie in G noch Platz ist.
}
FUNCTION CONCAT (T1,T2: STRING):STRING;
VAR I,J,P:INTEGER; G:STRING;
BEGIN
P := 0;
FOR I := 1 TO STRLEN DO
BEGIN
G[I] := T1[I]; {T1 ab links in G kopieren}
IF (G[I] <> ' ') THEN P := I
END;
J := 1;
FOR I := P TO STRLEN-1 DO
BEGIN
G[I+1] := T2[J]; {T2 ab Leertasten in G kopieren}
J := J + 1
END;
CONCAT := G
END;
{------------------------------------------------------------------------}
{
POS ermittelt die Position P des Teilstrings T im Gesamtstring G.
Wenn T in G nicht enthalten ist, wir P auf 0 gesetzt.
Aufrufen mit P := POS (T,G). Beispiel:
123456 Zaehlleiste
P P errechnet
'Peeker' G
'ee ' T, ab P in G
}
FUNCTION POS (T,G: STRING):INTEGER;
VAR I,J,L:INTEGER; F: BOOLEAN;
BEGIN
L := STRLEN;
WHILE (T[L] = ' ') AND (L <> 1) DO L := L - 1; {Laenge von T}
I := 0; {Zaehler fuer G}
REPEAT
J := 1; {Zaehler fuer T}
F := TRUE; {Flag}
WHILE (J <= L) DO
BEGIN
IF (G[I+J] <> T[J]) THEN F := FALSE;
J := J + 1;
END;
I := I + 1
UNTIL (F = TRUE) OR (L+I > STRLEN);
IF (F = TRUE) THEN POS := I ELSE POS := 0
END;
{------------------------------------------------------------------------}
{
COPY = Substring = Instring extrahiert Teilstring T aus Gesamtstring G ab
Position P in der Anzahl A; bei fehlerhaften Parametern soweit wie moeglich.
Aufrufen mit T := COPY (G,P,A). Beispiel: T := COPY (G,4,3)
123456 Zaehlleiste
P P = 4
123 A = 3
'Pascal' G
'cal ' T
}
FUNCTION COPY (G:STRING; P,A:INTEGER):STRING;
VAR I:INTEGER; T:STRING;
BEGIN
FOR I := 1 TO STRLEN DO T[I] := ' '; {Loeschen}
FOR I := 1 TO A DO {Wenn A < 1, dann Exit!}
IF (P+I <= STRLEN+1) AND (P>0) THEN T[I] := G[P+I-1];
COPY := T
END;
{------------------------------------------------------------------------}
{
DELETE entfernt aus Gesamtstring G die Anzahl A Zeichen ab Position P. Danach
ist G rechts mit der Anzahl A Leerzeichen aufgefuellt. Bei zu groessen Werten
von P und A wird entfernt und geloescht, soweit es geht.
Aufrufen mit DELETE (G,P,A). Beispiel: DELETE (G,5,5)
1234567890 Zaehlleiste
P P = 5
12345 A = 5
'Kyan-Kurs:' G vorher
'Kyan: ' G nachher
}
PROCEDURE DELETE (VAR G: STRING; P,A: INTEGER);
VAR I: INTEGER;
BEGIN
IF (P<1) THEN P := 1; IF (P > STRLEN) THEN P := STRLEN; {illegaler P-Wert}
WHILE (P+A > STRLEN+1) DO A := A - 1; {illegaler A-Wert}
FOR I := P TO STRLEN-1 DO IF (I+A <= STRLEN)
THEN G[I] := G[I+A] ELSE G[I] := ' ';
FOR I := STRLEN DOWNTO STRLEN-P+1 DO IF (I>0) THEN G[I] := ' '
END;
{-----------------------------------------------------------------------}
{
INSERT fuegt den Teilstring T in den Gesamtstring G ab Position P ein.
Wenn P zu gross ist, wird G von rechts entsprechend gekuerzt.
Aufrufen mit INSERT (T,G,P). Beispiel INSERT (T,G,5)
1234567890 Zaehlleiste
P P = 4
'einen ' G vorher
'fueg ' T
'einfuegen ' G nachher
}
PROCEDURE INSERT (T: STRING; VAR G: STRING; P:INTEGER);
VAR I,J,L:INTEGER;
BEGIN
IF (P<1) THEN P := 1; IF (P>STRLEN) THEN P := STRLEN; {Fehler}
L := STRLEN; WHILE (T[L] = ' ') AND (L>1) DO L := L - 1;
IF (L<>1) OR (T[1] <> ' ') THEN {T als Nullstring ignorieren}
BEGIN
J := 1;
WHILE (P <= STRLEN) AND (J <= L) DO
BEGIN
FOR I := STRLEN-1 DOWNTO P DO G[I+1] := G[I];
G[P] := T[J]; P := P + 1; J := J + 1
END
END
END;
{=======================================================================}
{Demos}
BEGIN
WRITELN ('Kurzbeispiele-------------------------------------------');
WRITELN (LENGTH ('PASCAL '));
G := CONCAT ('PAS ', 'CAL '); WRITELN (G:LENGTH (G));
WRITELN (POS ('CAL ', 'PASCAL '));
WRITELN (COPY ('PASCAL ', 2,3));
G := 'PASCAL '; DELETE (G,2,3); WRITELN (G:LENGTH (G));
INSERT ('ASC ',G,2); WRITELN (G:LENGTH (G));
WRITELN ('Length-Demo --------------------------------------------');
{1234567890 Zaehlleiste}
S := 'ABCDEFGHIJ'; L := LENGTH (S); WRITELN (L); {10}
S := 'A '; L := LENGTH (S); WRITELN (L); {1}
S := ' '; L := LENGTH (S); WRITELN (L); {0}
S := ' A A A A A'; L := LENGTH (S); WRITELN (L); {10}
WRITELN ('Concat-Demo -------------------------------------------');
{1234567890 Zaehlleiste}
T1 := 'ABCDE ';
T2 := 'FGHIJ '; G := CONCAT (T1,T2); WRITELN (G);
{'ABCDEFGHIJ'}
T1 := ' ';
T2 := 'FGHIJ '; G := CONCAT (T1,T2); WRITELN (G);
{'FGHIJ '}
T1 := 'ABCDE ';
T2 := ' '; G := CONCAT (T1,T2); WRITELN (G);
{'ABCDE '}
T1 := ' A';
T2 := ' B'; G := CONCAT (T1,T2); WRITELN (G);
{' A' Fehler}
T1 := 'ABCDEFGHI ';
T2 := 'ABCDEFGHIJ'; G := CONCAT (T1,T2); WRITELN (G);
{'ABCDEFGHIA' Fehler}
T1 := ' ';
T2 := ' '; G := CONCAT (T1,T2); WRITELN (G, '*')
;{' '}
WRITELN ('Pos-Demo --------------------------------------------');
{1234567890 Zaehlleiste}
G := 'ABCDEFGHIJ';
T := 'BC '; P := POS (T,G); WRITELN (P); {2}
G := 'ABCDEFGHIJ';
T := 'EFGHIJ '; P := POS (T,G); WRITELN (P); {5}
G := ' ';
T := ' '; P := POS (T,G); WRITELN (P); {1}
G := 'AAAAAAAAAA';
T := 'A '; P := POS (T,G); WRITELN (P); {1}
G := 'AAAAAAAAAA';
T := 'B '; P := POS (T,G); WRITELN (P); {0}
G := ' A';
T := ' A'; P := POS (T,G); WRITELN (P); {1}
WRITELN ('Copy-Demo -------------------------------------------');
{1234567890 Zaehlleiste}
G := 'ABCDEFGHIJ';
T := COPY (G,1,5); WRITELN (T); {'ABCDE'}
T := COPY (G,6,5); WRITELN (T); {'FGHIJ'}
T := COPY (G,9,8); WRITELN (T); {'IJ', Teilkopie}
T := COPY (G,0,8); WRITELN (T, '*'); {fehlerhaft}
T := COPY (G,0,0); WRITELN (T, '*'); {fehlerhaft}
WRITELN ('Delete-Demo -----------------------------------------');
{1234567890 Zaehlleiste}
G := 'ABCDEFGHIJ'; DELETE (G,1,10); WRITELN (G, '*');
{' '}
G := 'ABCDEFGHIJ'; DELETE (G,5,5); WRITELN (G);
{'ABCDJ '}
G := 'ABCDEFGHIJ'; DELETE (G,2,2); WRITELN (G);
{'ADEFGHIJ '}
G := ' A'; DELETE (G,1,9); WRITELN (G);
{'A '}
G := 'A '; DELETE (G,1,1); WRITELN (G, '*');
{' '}
WRITELN ('Insert-Demo -----------------------------------------');
{1234567890 Zaehlleiste}
G := 'ABCDEJ ';
T := 'FGHI '; INSERT (T,G,6); WRITELN (G);
{'ABCDEFGHIJ'}
G := 'J ';
T := 'ABCDEFGHI '; INSERT (T,G,1); WRITELN (G);
{'ABCDEFGHIJ'}
G := ' FGHIJ'; {Fuehrende Leertasten gelten!}
T := 'ABCDE '; INSERT (T,G,1); WRITELN (G);
{'ABCDE ' Fehler}
G := ' AAA ';
T := 'BBB '; INSERT (T,G,7); WRITELN (G);
{' BBBA' Fehler}
G := ' ';
T := 'ABC '; INSERT (T,G,5); WRITELN (G);
{' ABC '}
WRITELN ('Leertasten eliminieren-------------------------------');
S := 'Peeker ';
WRITELN (S:LENGTH (S), '/');
{sicherer:} IF LENGTH (S) > 0 THEN WRITELN (S:LENGTH (S), '/');
S := CONCAT ('Daten ', 'typ ');
WRITELN (S:LENGTH (S), '/');
{sicherer:} IF LENGTH (S) > 0 THEN WRITELN (S:LENGTH (S), '/');
S := 'Leftstring'; {hier die ersten 4 Zeichen}
WRITELN (S, '/');
IF LENGTH (S) > 4 THEN WRITELN (S:4, '/')
END.